package com.example.tester.config;


import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitDirectConfig {

    /**
     * DirectExchange是RabbitMQ Broker的默认Exchange，
     * 它有一个特别的属性对一些简单的应用来说是非常有用的，
     * 在使用这个类型的Exchange时，可以不必指定routing key的名字，
     * 在此类型下创建的Queue有一个默认的routing key，这个routing key一般同Queue同名
     *
     *
     *  DirectExchange 适用场景
     *
     *  这种类型的Exchange，通常是将同一个message以一种循环的方式分发到不同的Queue，即不同的消费者手中
     *  使用这种方式，值得注意的是message在消费者之间做了一个均衡，而不是说message在Queues之间做了均衡
     *
     *
     *
     */
    public static final String DIRECT_QUEUE1 = "direct.queue1";
    public static final String DIRECT_QUEUE2 = "direct.queue2" ;
    public static final String DIRECT_EXCHANGE = "direct.exchange";


    /**
     * direct模式---严格匹配 routingKey 和 bindingKey
     *
     * 消息中的路由键（routing key）如果和 Binding 中的 binding key 一致，交换器就将消息发到对应的队列中。
     *
     * direct此类型交换机创建的Queue有一个默认的routing key，这个routing key一般同Queue同名
     *
     * @return
     */
    @Bean
    public Queue directQueue1() {
        return new Queue(DIRECT_QUEUE1);
    }

    @Bean
    public Queue directQueue2() {
        return new Queue(DIRECT_QUEUE2);
    }

    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange(DIRECT_EXCHANGE);
    }


    /**
     * 配置不使用默认的binding key (默认的binding key 和 Queue同名)
     *
     *
     * 例子：
     *   当前交换机配置了两个binding key 分别为 direct.pwl1  和 direct.pwl2
     *   1.当生产者--消息发送者发送的消息中 routingkey 为  direct.pwl1 时 ,消息被directBinding1接收
     *   2.当生产者--消息发送者发送的消息中 routingkey 为  direct.pwl2 时 ,消息被directBinding2接收
     *
     *
     * @return
     */
    @Bean
    public Binding directBinding1() {
        return BindingBuilder.bind(directQueue1())
                .to(directExchange())
                .with("direct.pwl1");
    }

    @Bean
    public Binding directBinding2() {
        return BindingBuilder.bind(directQueue2())
                .to(directExchange())
                .with("direct.pwl2");
    }

}
